package com.power.sifa.util.service.impl;

import cn.hutool.core.util.ArrayUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.power.sifa.util.service.SmsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 电信的那时快短信  - 文书签收
 * sms:
 * enable: true
 * type: didi
 * apikey: sfj1115
 * secretkey: 8vQu830#1503
 * tpl_fileaccept: SD000001
 *
 * @author wangn
 */
@Slf4j
@Service
@ConditionalOnProperty(prefix = "sms", name = "type", havingValue = "didi")
public class DidiSmsServiceImpl implements SmsService {
    /**
     * 单个短信的发送URL
     */
    private static final String URL_SEND = "http://api.didisms.com/SendSms.aspx";

    @Value("${sms.enable:#{true}}")
    public Boolean enable = true;

    @Value("${sms.apikey}:#{'sfj1115'}}")
    public String api_key = "sfj1115";

    @Value("${sms.secretkey:#{'8vQu830'}}")
    public String secret_key = "8vQu830#1503";

    private String md5_key;


    // 行政复议文书签收模板
    public static final String tpl_fileaccept = "SD000001";
    // 登录注册验证码模板
    public static final String tpl_vericode = "VC000001";
    // 社矫区县人员-预警通知模板
    public static final String tpl_crcleder_warncode = "CRC000001";
    // 社矫司法所人员-预警通知模板
    public static final String tpl_crcwork_warncode = "CRC000002";
    // 社矫区县人员-督办通知模板
    public static final String tpl_crcleder_supcode = "CRC000003";
    // 社矫区县人员-督办通知模板
    public static final String tpl_crcwork_supcode = "CRC000004";
    // 社矫区县人员-督办通知模板
    public static final String tpl_supervise_filetarget = "SUP000001";

    /**
     *  社矫区县人员-督办通知-决定前模板
     */
    public static final String tpl_supervise_filetargetbefore = "SUP000002";

    /**
     * 模板代码 - 模板格式
     */
    public static Map<String, String> templeteMap = new HashMap<String, String>();

    static {
        // 行政复议模板
        templeteMap.put(DidiSmsServiceImpl.tpl_fileaccept, "尊敬的%s，关于%s，您有【%s】待签收，请于七天工作日日内访问：%s，查看，验证码：%s，为保障您的信息安全，请勿将该短信转发给他人，如有疑问请致电：%s。文书下载请登录电脑端（推荐使用WPS打开，避免缺失字体）。退订回N");
        // 短信验证码
        templeteMap.put(DidiSmsServiceImpl.tpl_vericode, "验证码%s，五分钟内有效");
        // 社矫区县人员-预警通知
        templeteMap.put(DidiSmsServiceImpl.tpl_crcleder_warncode, "你辖区内社区矫正对象【%s】，触发【%s】预警，请尽快安排工作人员处理，并将结果上传系统。退订回N");
        // 社矫司法所人员-预警通知
        templeteMap.put(DidiSmsServiceImpl.tpl_crcwork_warncode, "你辖区内社区矫正对象【%s】，触发【%s】预警，请尽快处理，并将结果上报县级社区矫正机构。退订回N");
        // 社矫区县人员-督办通知
        templeteMap.put(DidiSmsServiceImpl.tpl_crcleder_supcode, "收到一条督办通知，你辖区内社区矫正对象【%s】，触发【%s】预警，请尽快安排工作人员处理，并将结果上传系统。退订回N");
        // 社矫司法所人员-督办通知
        templeteMap.put(DidiSmsServiceImpl.tpl_crcwork_supcode, "收到一条督办通知，你辖区内社区矫正对象【%s】，触发【%s】预警，请尽快处理，并将结果上报县级社区矫正机构。退订回N");
        // 行政复议监督模板
        templeteMap.put(DidiSmsServiceImpl.tpl_supervise_filetarget, "%s，市政府于%s下达【%s】（%s），要求你府于60日内反馈处理情况，现期限将近，请抓紧时间履行。退订回N");
        // 行政复议监督模板
        templeteMap.put(DidiSmsServiceImpl.tpl_supervise_filetargetbefore, "%s，市政府收到申请人对你府的行政复议监督申请（%s），要求你府于60日内反馈处理情况，现期限将近，请抓紧时间履行。退订回N");

    }

    /**
     * @param tpl_code：模板编号
     * @param params：短信参数，可为空  对应的字段为用户名称，案号,文件类型，验证码，电话。
     * @param mobile：接收手机号，可多个
     * @return
     */
    @Override
    public String sendTemplate(String tpl_code, List<String> params, String... mobile) {
        String msgid = null;
        if (!enable) {
            log.info("短信开关未开启 sms.enable: false");
            return msgid;
        }

        if (md5_key == null) {
            md5_key = DigestUtil.md5Hex(api_key + secret_key);
        }
        log.info("ora_key: {}", api_key + secret_key);
        log.info("md5_key: {}", md5_key);

        String msg = templeteMap.get(tpl_code);
        Assert.notNull(msg, "没有配置短信模板" + tpl_code);

        String msgtxt = String.format(msg, params.toArray());
        log.info("发送短信: {}, {}", ArrayUtil.join(mobile, ","), msgtxt);

        Map<String, Object> formMap = new HashMap<>();
        formMap.put("user", api_key);
        formMap.put("passwd", md5_key);
        formMap.put("msg", msgtxt);
        formMap.put("mobs", ArrayUtil.join(mobile, ","));

        HttpResponse response = null;
        response = HttpRequest.post(URL_SEND)
                .header("Content-Type", "application/x-www-form-urlencoded")
                .form(formMap)
                .timeout(10000)
                .execute();
        String re = response.body();
        log.info("发送短信返回 {}", re);

        if (re.indexOf(",") != -1) {
            String[] result = re.split(",");
            if (result[0].equals("0")) {
                //成功
                msgid = result[1];
            } else {
                log.error("发送短信失败");
                throw new RuntimeException("发送短信失败");
            }
        }
        return msgid;
    }

}
